package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.xxxtea.common.BaseEnum;
import com.xxxtea.config.converter.BaseEnumDeserializer;
import com.xxxtea.mpe.annotation.Constraint;
import com.xxxtea.mpe.annotation.ExtendQuery;
import com.xxxtea.mpe.handler.AttachmentHandler;
import com.xxxtea.mpe.model.Attachment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

/**
 * 订单项实体类
 *
 * 用于存储订单中的商品明细，包括：
 * - 商品基本信息（名称、图片、价格、数量等）
 * - 业务类型区分（外卖、旧物）
 * - 关联订单、用户、商家、评价等信息
 *
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 *
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("订单项")
@TableName(autoResultMap = true)
public class OrderItem {

	/**
	 * 主键ID
	 * 使用自增策略
	 */
	@ApiModelProperty("主键")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 订单ID
	 * 关联Order表
	 */
	@ApiModelProperty("订单ID")
	private Integer orderId;

	/**
	 * 用户ID
	 * 下单用户，自动填充
	 */
	@ApiModelProperty("用户ID")
	@TableField(fill = FieldFill.INSERT)
	private Integer userId;

	/**
	 * 商家ID
	 * 关联商家
	 */
	@ApiModelProperty("商家ID")
	private Integer merchantId;

	/**
	 * 评价ID
	 * 关联评价表
	 */
	@Constraint(referenceClass = Review.class)
	@ApiModelProperty("评价ID")
	private Integer reviewId;

	/**
	 * 业务ID
	 * 商品或菜品ID
	 */
	@ApiModelProperty("业务ID")
	private Integer businessId;

	/**
	 * 业务类型
	 * 1-外卖订单 2-旧物订单
	 * 使用枚举类型区分
	 */
	@ApiModelProperty("业务类型 1-外卖订单 2-旧物订单")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private BusinessType businessType;

	/**
	 * 商品名称
	 */
	@ApiModelProperty("名称")
	private String name;

	/**
	 * 商品图片
	 * 使用自定义处理器
	 */
	@ApiModelProperty("图片")
	@TableField(typeHandler = AttachmentHandler.class)
	private Attachment image;

	/**
	 * 商品价格
	 */
	@ApiModelProperty("价格")
	private Double price;

	/**
	 * 商品数量
	 */
	@ApiModelProperty("数量")
	private Integer count;

	/**
	 * 评分
	 * 扩展查询字段，关联评价表获取评分
	 */
	@ExtendQuery(referenceClass = Review.class, targetColumn = "rating")
	private Double rating;

	/**
	 * 评价内容
	 * 扩展查询字段，关联评价表获取内容
	 */
	@ExtendQuery(referenceClass = Review.class, targetColumn = "content")
	private String content;

	/**
	 * 业务类型枚举
	 * 区分订单项类型
	 */
	@Getter
	@AllArgsConstructor
	public enum BusinessType implements BaseEnum<BusinessType> {
		/**
		 * 外卖订单
		 */
		DISH(1, "外卖订单"),
		/**
		 * 旧物订单
		 */
		PRODUCT(2, "旧物订单"),
		;
		private final Integer value;
		private final String label;
	}
}